Base64 编码图片被自动换行
一.问题由来
问题如题,这种情况在使用android 和 eclipse中都碰到.
1. 环境介绍
android 中使用 import android.util.Base64.*;
eclipse 中使用
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
2. 问题详情
使用Base64编码图片为字符串,发送给服务器,服务器收到的字符串是一段一段的,并不没有一次性接受所有的字符串.
二.查询资料
为解决这个问题,我查询了base64的各种资料.
1.历史由来
Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现.
刚开始,sun公司的sun.misc.BASE64Encoder的base64包使用较多,由于是公司内部使用,对外支持不好,时常出现导包错误,现在不推荐使用.
详情参见oracle 公司的公告: Why Developers Should Not Write Programs
That Call ‘sun’ Packages
The sun. packages are not part of the supported, public interface.
A Java program that directly calls into sun. packages is not guaranteed to work on all Java-compatible platforms. In fact, such a program is not guaranteed to work even in future versions on the same platform.
意思是sun.* 这样的包对java程序的支持不好,会导致程序不能工作.
后来,oracle自己弄了一个base64的包,
import org.apache.commons.codec.binary.Base64;
这个包就没那么多问题,具体使用方法如下:
byte[] encodedBytes = Base64.encodeBase64(“Test”.getBytes());
System.out.println(“encodedBytes “ + new String(encodedBytes));
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println(“decodedBytes “ + new String(decodedBytes));
再后来,Java 8实现了BASE64编解码API,它包含到java.util包,从此 base64 名正言顺.
import java.util.Base64;
具体使用如下:
byte[] encodedBytes = Base64.getEncoder().encode(“Test”.getBytes());
System.out.println(“encodedBytes “ + new String(encodedBytes));
byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes);
System.out.println(“decodedBytes “ + new String(decodedBytes));
关于java 8 中base64 更详细的介绍请查看:
BASE64 和 Java 8实现BASE64编解码
三.原因分析
由于我使用sun. 和 android.util.base64.包,用Base64编码的时候如果出现\n 之类的字符,Java中转义。
当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符。
而现在使用的java.util.Base64; 没有这个特点.
四.解决方案
对于eclipse,
1. 继续使用sun.* 包
重写base64 编码.
具体实现可参照 重写BASE64Encoder
2. 换用其他包,比如 java.util.Base64包
具体使用方法请查看官网使用文档.
对于android,
将android.util.Base64.encodeToString(input, Base64.DEFAULT)
换成
Android.util.Base64.encodeToString(input, Base64.NO_WRAP);